package com.shujia.scala

import scala.collection.mutable

object Demo11Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map：每个元素都是KV格式，Key是不能重复的，并且Key在Map中的无序的
     * 适用于通过K查找V的场景
     */

    // Map定义
    val map01: Map[String, Int] = Map[String, Int](("k1", 1), Tuple2("k2", 2), "k3" -> 3, "k1" -> 11)

    println(map01)

    // 通过k取v
    println(map01.contains("k1")) // 判断key是否存在
    println(map01("k1")) // 直接通过key取value，不存在
    //    println(map01("kk1")) // 直接通过key取value，不存在就直接报错
    println(map01.get("k1")) // 通过key取value，取到了就返回Some
    println(map01.get("kk1")) // 通过key取value，取不到就返回None
    println(map01.getOrElse("k1", 0)) // 通过key取value，取不到就返回默认值
    println(map01.getOrElse("kk1", 0)) // 0

    val key: String = "kk1"
    val x: Option[Int] = map01.get(key)
    // 分情况处理
    // getOrElse原理如下
    val i: Int = x match {
      // 取到的情况
      case Some(v) =>
        v
      // 没取到的情况
      case None =>
        0
    }
    println(i)

    /**
     * Option类型：仅包含了两个子类，分别是Some、None
     * 在某些情况下会存在不确定因素，会有 存在 和 不存在的情况
     * 存在就可以返回Some
     * 不存在就返回None
     *
     * Option就可以保证取值时更加可靠
     */

    // map、flatMap、filter、groupBy、foreach在Map数据容器中都有，但是sort相关的操作没有
    // 如果需要对Map中的KV做排序，可以将其转成List再进行sort

    val stuMap: Map[String, String] = Map[String, String]("001" -> "zs,20,男,一班", "002" -> "ls,18,女,二班", "003" -> "lg,21,男,一班")
    // 统计班级的最大年龄
    stuMap
      // map方法返回二元组时，会默认将其变为Map，如果二元组的Key相同，则会发生数据覆盖现象
      .map(kv => {
        val splits: Array[String] = kv._2.split(",")
        (kv._1, splits(3), splits(1))
      })
      .groupBy(t3 => t3._2)
      .map(t2 => {
        val clazz: String = t2._1
        s"$clazz,${t2._2.map(t3 => t3._3).max}"
      })
      .foreach(println)

    /**
     * 可变的Map
     */
    val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.Map[String, Int]("k1" -> 1, "k2" -> 2, "k3" -> 3)
    println(mutableMap)

    // 增加/修改 KV
    mutableMap.put("k3", 33) // key存则覆盖
    mutableMap.put("k4", 4)
    mutableMap.update("k3",133)

    mutableMap("k5") = 5
    println(mutableMap)

    // 删除KV
    mutableMap.remove("k2")
    println(mutableMap)
  }

}
